// Copyright (c) 2020 Presto Labs Pte. Ltd.
// Author: donggu

// #include <gtest/gtest.h>

// #include "coin/feed/fastfeed/feed.pb.h"
// #include "coin2/base/config/app_config.h"
// #include "coin2/exchange/base/market/enums.h"
// #include "coin2/exchange/base/market/market_exchange_api.h"
// #include "coin2/exchange/huobi/symbology/product.h"
// #include "coin2/feed/fastfeed/reader.h"
// #include "coin2/feed/fastfeed/system.h"

// using coin2::exchange::base::market::MarketExchangeApi;
// using namespace coin2::exchange::base::symbology;
// using namespace coin::proto;
// using coin2::exchange::symbology::ProductRequest;
// using fastfeed::proto::Feed;

// const size_t BUF_SIZE = 5 * 1024 * 1024;

// #if 0
// TEST(FastFeed, ProtoReader) {
//   FastFeedProtoReader r(std::unique_ptr<orio::io::Reader<orio::record::SimpleRecord>>(
//                             orio::record::SimpleReader::FromFile(
//                                 "/remote/iosg/coin-2/feed_cache/feed-01.cn-hongkong.aliyun/"
//                                 "20191110/Spot.Okex.v3/LTC-USDK.Okex.ltc_usdk.W2.gz",
//                                 BUF_SIZE)),
//                         BUF_SIZE);

//   Feed f;
//   size_t n = 0;
//   while (r.Read(&f)) {
//     n++;
//   }

//   EXPECT_EQ(n, 42756);
// }

// TEST(FastFeed, IntervalReader) {
//   IntervalFastFeedReader r(
//       std::make_unique<FastFeedProtoReader>(
//           std::unique_ptr<orio::io::Reader<orio::record::SimpleRecord>>(
//               orio::record::SimpleReader::FromFile(
//                   "/remote/iosg/coin-2/feed_cache/feed-01.cn-hongkong.aliyun/20191110/"
//                   "Spot.Okex.v3/LTC-USDK.Okex.ltc_usdk.W2.gz",
//                   BUF_SIZE)),
//           BUF_SIZE),
//       1573392486625062000, 1573403647404944000);

//   Feed f;
//   size_t n = 0;
//   while (r.Read(&f)) {
//     n++;
//   }

//   EXPECT_EQ(n, 10000 + 2);  // 2 for meta
// }

// TEST(FastFeed, MergedReader) {
//   std::unique_ptr<orio::io::Reader<Feed>> r1 = std::make_unique<FastFeedProtoReader>(
//       std::unique_ptr<orio::io::Reader<orio::record::SimpleRecord>>(
//           orio::record::SimpleReader::FromFile(
//               "/remote/iosg/coin-2/feed_cache/feed-01.cn-hongkong.aliyun/20191110/Spot.Okex.v3/"
//               "LTC-USDK.Okex.ltc_usdk.W1.gz",
//               BUF_SIZE)),
//       BUF_SIZE);
//   std::unique_ptr<orio::io::Reader<Feed>> r2 = std::make_unique<FastFeedProtoReader>(
//       std::unique_ptr<orio::io::Reader<orio::record::SimpleRecord>>(
//           orio::record::SimpleReader::FromFile(
//               "/remote/iosg/coin-2/feed_cache/feed-01.cn-hongkong.aliyun/20191110/Spot.Okex.v3/"
//               "LTC-USDK.Okex.ltc_usdk.W2.gz",
//               BUF_SIZE)),
//       BUF_SIZE);

//   std::vector<std::unique_ptr<orio::io::Reader<Feed>>> v;
//   v.push_back(std::move(r1));
//   v.push_back(std::move(r2));
//   MergedFastFeedReader r(std::move(v));

//   Feed f;
//   size_t n = 0;
//   while (r.Read(&f)) {
//     n++;
//   }
//   // 42756*2 = 85512
//   EXPECT_EQ(n, 85046);  // 42756 + 42290
// }

// TEST(FastFeed, Reader) {
//   auto ReadInterval = [](int64_t t1, int64_t t2) -> size_t {
//     using coin2::exchange::huobi::symbology::HuobiProduct;
//     using coin2::exchange::base::symbology::IProduct;

//     std::vector<ProductRequest> reqs;
//     ProductRequest req;
//     req.set_mea(MarketExchangeApi{Spot, Huobi, "v1"}.String());
//     req.set_native("adaeth");
//     reqs.push_back(req);
//     req.set_native("adausdt");
//     reqs.push_back(req);

//     FastFeedReader r(reqs, "snapshot",
//                      "feed-01.cn-hongkong.aliyun",
//                      FastFeedReader::DEFAULT_ROOT, 1,
//                      DurationFromString("0"), t1, t2, BUF_SIZE);

//     Feed f;
//     size_t n = 0;
//     while (r.Read(&f)) {
//       n++;
//     }
//     return n;
//   };

//   const int64_t t1 = 1573384700000000000;
//   const int64_t t2 = 1573384900000000000;
//   const int64_t t3 = 1573385100000000000;

//   auto n1 = ReadInterval(t1, t2);
//   auto n2 = ReadInterval(t2, t3);
//   auto n3 = ReadInterval(t1, t3);
//   EXPECT_EQ(n1, 522 + 4);  // 4 = meta
//   EXPECT_EQ(n2, 420 + 4);
//   EXPECT_EQ(n3, (n1 - 4) + (n2 - 4) + 4);
// }
// #endif
